查看原文
其他

现代编程语言最有趣的 10 大特性

justjavac justjavac 2018-11-28

Ten interesting features from various modern languages

阅读时间大概 2 分钟


如今大多数“现代”语言都依然使用老旧的 C-style 语法。

我们看一下编程语言的年代:Lisp (1958)、Smalltalk (1972)、Objective-C (1984)、Haskell (1990)、OCaml (1996)、等等。这些都是上个世纪的语言了。

本文作者选择了几个最新的语言:Reason、Swift、Kotlin、Dart 作为研究对象,总结了 10 个特性:

1 管道操作符 Pipeline operator

Reason 语法

  1. let newScore = me.score

  2.  |> double

  3.  |> (it) => add(7, it)

  4.  |> (it) => boundScore(0, 100, it);

对应的 JavaScript 写法:

  1. boundScore(0, 100, add(7, double(me.score)));

而 es 也已经有了对应的提案:tc39/proposal-pipeline-operator

2 模式匹配 Pattern matching

Kotlin 语法

  1. when (x) {

  2.    in 1..10 -> print("x is in the range")

  3.    in validNumbers -> print("x is valid")

  4.    !in 10..20 -> print("x is outside the range")

  5.    else -> print("none of the above")

  6. }

3 Reactive (Rx) programming build in the language

Dart 语法

  1. input.onKeyDown                                              

  2.  .where((e) => e.ctrlKey && e.code == 'Enter')              

  3.  .forEach((e) => dispatch(addTodoAction(e.target.value)));

4 lambda 函数的默认参数

Kotlin 语法(使用 it 作为默认参数)

  1. strings

  2.  .filter{ it.length == 5 }

  3.  .map{ it.toUpperCase() }

对比 JavaScript

  1. strings

  2.  .filter{ it => it.length === 5 }

  3.  .map{ it => it.toUpperCase() }

5 解构 Destructuring

Reason 语法:

  1. let someInts = (10, 20);

  2. let (ten, twenty) = someInts;

  3. type person = {name: string, age: int};

  4. let somePerson = {name: "Guy", age: 30};

  5. let {name, age} = somePerson;

Kotlin 语法

  1. data class Person(val name: String, val age: Int)

  2. val(name, age) = Person("Guy", 20)

es6 已经有了数组解构,es8 增加了对象解构

6 操作符级联 Cascade operator

Dart 语法

  1. querySelector('#button') // Get an object.

  2.  ..text = 'Confirm' // Use its members.

  3.  ..classes.add('important')

  4.  ..onClick.listen((e) => dispatch(confirmedAction()));

对应的 JavaScript 写法

  1. var button = querySelector('#button');

  2. button.text = 'Confirm';

  3. button.classed.add('important');

  4. button.onClick.listen((e) => dispatch(confirmedAction()));

如果使用 jQuery 基本在写法上就和 dart 一致了,但是两者有本质的不同

7 if 表达式 If expressions

Kotlin 语法

  1. val result = if (param == 1) {

  2.    "one"

  3. } else if (param == 2) {

  4.    "two"

  5. } else {

  6.    "three"

  7. }

对于 if 表达式有人喜欢,有人讨厌,有人觉得无所谓;我是非常喜欢的,我之前在知乎有个回答:https://www.zhihu.com/question/55866176/answer/149009695

8 Try expressions

Kotlin 语法

  1. val result = try {

  2.    count()

  3. } catch (e: ArithmeticException) {

  4.    throw IllegalStateException(e)

  5. }

9 自动科里化 Automatic currying

Reason 语法:

  1. let add = (x, y) => x + y;   /* same as (x) => (y) => x + y; */

  2. let five = add(2,3);         /* 5 */

  3. let alsoFive = add(2)(3);    /* 5 */

  4. let addFive = add(5);        /* y => 5 + y; */

  5. let eleven = addFive(6);     /* 11 */

  6. let twelve = addFive(7);     /* 12 */

10 方法扩展 Method extensions

Swift 语法:

  1. extension Int {

  2.    func repetitions(task: () -> Void) {

  3.        for _ in 0..<self {

  4.            task()

  5.        }

  6.    }

  7. }

  8. 3.repetitions({

  9.    print("Hello!")

  10. })

  11. // Hello!

  12. // Hello!

  13. // Hello!

JavaScript 可以在原型上扩展。

我觉得还有要给非常有用的特性,optional-chaining。之所以没有提到,是因为大多数语言都已经有这个特性了吧,看来 JavaScript 还是发展太慢啊。。。


阅读原文:Ten interesting features from various modern languages

讨论地址:现代编程语言最有趣的 10 大特性

如果你想参与讨论,请点击这里


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存